package org.algorithm.biubiu.wheel_1.字符串;

import org.junit.Test;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @date 2022-04-15 星期五 00:00
 * 给定两个字符串s和 p，找到s中所有p的异位词的子串，返回这些子串的起始索引。不考虑答案输出的顺序。
 * <p>
 * 异位词 指由相同字母重排列形成的字符串（包括相同的字符串）。
 * <p>
 * <p>
 * <p>
 * 示例1:
 * <p>
 * 输入: s = "cbaebabacd", p = "abc"
 * 输出: [0,6]
 * 解释:
 * 起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
 * 起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
 * 示例 2:
 * <p>
 * 输入: s = "abab", p = "ab"
 * 输出: [0,1,2]
 * 解释:
 * 起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
 * 起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
 * 起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/find-all-anagrams-in-a-string
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class 找到字符串中所有字母异位词 {

        // 暴力 超时
    Set<String> allchild = new HashSet();
    char[] arr ;
    public List<Integer> findAnagrams(String s, String p) {
        arr = p.toCharArray();
        backTracking(0);
        List<Integer> res = new ArrayList();
        for(int i=0;i<=s.length()-p.length();i++){
            if(p.indexOf(s.charAt(i))>=0){
                String cur =  getSubString(s,i,i+p.length());
                if(allchild.contains(cur)){
                    res.add(i);
                }
            }

        }
        return res;
    }


    public void backTracking(int index){
        if(index==arr.length-1){
            allchild.add(String.valueOf(arr));
            return ;
        }

        for(int i=index;i<arr.length;i++){
            swap(i,index);
            backTracking(index+1);
            swap(index,i);
        }
    }

    public void swap(int a,int b){
        char tmp;
        tmp = arr[a];
        arr[a] =arr[b];
        arr[b] = tmp;
    }

    private String getSubString(String data,int i, int i1) {
        String substring = data.substring(i, i1);
        return substring;
    }

}
